'''
编写程序，利用“凯撒密码”方案，实现对用户输入文字的加密操作。
凯撒密码（英语：Caesar cipher），是一种最简单且最广为人知的加密技术。它是一种替换加密的技术，明文中所有字母都在字母
表向后（或向前）按照固定数目进行偏移后被替换成密文。例如，当偏移量是3的时候，所有的字母A将替换成D、B变成E，以此类推。
'''

from tkinter import *
from string import *
import tkinter.messagebox

# 定义加密按钮触发功能函数
def encryption():
    #获取原文输入框内容
    password = u.get()
    
    #判断密钥输入是否为全数字类型，如果全是就获取输入框的密钥数值并输出加密结果，否则弹框警告。
    if k.get().strip().isdigit() == True:
        key = int(k.get().strip())
        tkinter.messagebox.showinfo(title='加密结果', message= (kasa(password,key,True)))
    else:
        tkinter.messagebox.showwarning(title='警告！', message='请输入由数字组成的密钥！')

# 定义解密按钮触发功能函数
def decryption():
    #获取原文输入框内容
    password = u.get()

    #判断密钥输入是否为全数字类型，如果全是就获取输入框的密钥数值并输出解密结果，否则弹框警告。
    if k.get().strip().isdigit() == True:
        key = int(k.get().strip())
        tkinter.messagebox.showinfo(title='解密结果', message= (kasa(password,key,None)))
    else:
        tkinter.messagebox.showwarning(title='警告！', message='请输入由数字组成的密钥！')
   
# 定义凯撒密码函数功能
def kasa(pw,k,mode=True):

    '''
    凯撒密码 参数：
    pw:原文
    k：密钥
    '''

    # 'abcdefghijklmnopqrstuvwxyz0123456789'
    lows = ascii_lowercase + digits
    # 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
    ups = ascii_uppercase + digits

    k = k % len(lows) #密码取余

	# 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'  
    before = lows + ups
	
	# 小写字母和数字移后K位，大写字母和数字移后K位
    after = lows[k:]+lows[:k]+ups[k:]+ups[:k]
	
	# maketrans() 方法用于创建字符映射的转换表，对于接受两个参数的最简单的调用方式，第一个参数是字符串，表示需要转换的字符，第二个参数也是字符串表示转换的目标。两个字符串的长度必须相同，为一一对应的关系。
	# translate() 方法根据参数table给出的表(包含 256 个字符)转换字符串的字符。
    if mode==True:
		# 加密
        table=''.maketrans(before,after)
    else:
		# 解密
        table=''.maketrans(after,before)
    return pw.translate(table)

# 实例化object，建立窗口window
windows = Tk()

# 给窗口的可视化起名字
windows.title("Caesar")

# 使用框架（Frame）控件在屏幕上显示一个矩形区域，用来作为容器。
frame = Frame(windows)

# padx和pady用于设置框架的外部填充显示，ipadx和ipady用于设置框架的内部显示。
frame.pack(padx=8, pady=8, ipadx=4, ipady=0)

'''
界面设置：
    1、原文输入框；
    2、密钥输入框；
    3、加密解密按钮。
'''
lab_pwd = Label(frame, text="原文:")
lab_pwd.grid(row=0, column=0, padx=5, pady=5, sticky=W)

u = StringVar()
ent_pwd = Entry(frame, textvariable=u)
ent_pwd.grid(row=0, column=1, sticky='ew', columnspan=2)

lab_key = Label(frame, text="密钥:")
lab_key.grid(row=1, column=0, padx=5, pady=5, sticky=W)

k = StringVar()
ent_key = Entry(frame, show='*', textvariable=k)
ent_key.grid(row=1, column=1, sticky='ew', columnspan=2)

button_encryption = Button(frame, text="加密", command=encryption, default='active')
button_encryption.grid(row=3, column=1)

#使“加密”和“解密”按钮间隔开
lab = Label(frame, text="")
lab.grid(row=3, column=0, sticky=W)

button_decryption = Button(frame, text="解密", command=decryption, default='active')
button_decryption.grid(row=3, column=2, padx=5, pady=5)

#居中显示窗口
windows.update_idletasks()
x = (windows.winfo_screenwidth() - windows.winfo_reqwidth()) / 2
y = (windows.winfo_screenheight() - windows.winfo_reqheight()) / 2
windows.geometry("+%d+%d" % (x, y))

# 禁止拉伸窗口
windows.resizable(0,0)

#主窗口循环显示
windows.mainloop()